package cn.com.pc.content.mongo;

import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.List;
import java.util.Optional;

/**
 * 在MongoRepository基础上增加指定collectionName的方法
 *
 * @param <T>
 * @param <ID>
 */
@NoRepositoryBean
public interface CustomMongoRepository<T, ID> extends MongoRepository<T, ID> {

    String getCollectionName();

    void setCollectionName(String collectionName);

    <S extends T> S save(S entity, String collectionName);

    <S extends T> List<S> saveAll(Iterable<S> entities, String collectionName);

    Optional<T> findById(ID id, String collectionName);

    boolean existsById(ID id, String collectionName);

    long count(String collectionName);

    void deleteById(ID id, String collectionName);

    void delete(T entity, String collectionName);

    void deleteAll(Iterable<? extends T> entities,  String collectionName);

    void deleteAll(String collectionName);

    List<T> findAll(String collectionName);

    Iterable<T> findAllById(Iterable<ID> ids, String collectionName);

    Page<T> findAll(Pageable pageable, String collectionName);

    public List<T> findAll(Sort sort, String collectionName);

    <S extends T> S insert(S entity, String collectionName);

    <S extends T> Page<S> findAll(final Example<S> example, Pageable pageable, String collectionName);

    <S extends T> List<S> findAll(Example<S> example, Sort sort, String collectionName);

    <S extends T> List<S> findAll(Example<S> example, String collectionName);

    <S extends T> Optional<S> findOne(Example<S> example, String collectionName);

    <S extends T> long count(Example<S> example, String collectionName);

    <S extends T> boolean exists(Example<S> example, String collectionName);
}
